/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : SysUtcTime.c
  * @brief          : SysUtcTime
  ******************************************************************************
  * @attention
  * 本文件用于  系统时间处理
  * @20210412:文件模板第一次生成
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "SysUtcTime.h"

/* USER CODE END Includes */

/* Private typedef ------------------私有结构体-----------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define -----------------私有宏--------------------------------*/
/* USER CODE BEGIN PD */





/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */



/* USER CODE END PM */




/* Private variables --------------私有变量-------------------------------------------*/

/* USER CODE BEGIN PV */

uint8_t	tTimeSart=0;

volatile uint32_t	SysTimeUnix;
volatile uint32_t	SysRunTimeSec;

static uint32_t month[12]=
{
	2678400,	/*1*/
	2419200,	/*2*/
	2678400,	/*3*/
	2592000,	/*4*/
	2678400,	/*5*/
	2592000,	/*6*/
	2678400,	/*7*/
	2678400,	/*8*/
	2592000,	/*9*/
	2678400,	/*10*/
	2592000,	/*11*/
	2678400		/*12*/
	
};///////定义每个月份的秒数


/* USER CODE END PV */




/* Private function prototypes --------私有子函数---------------------------------------*/

/* USER CODE BEGIN PFP */

uint32_t TimeToUnix(uint16_t Hours,uint16_t Minutes)
{
	uint32_t unix;
	unix=Hours*3600;
	unix+=Minutes*60;
	return unix;
}

/////时间戳转日期时间

void UnixToDateTime(uint32_t unix,DateTimeDef *sDateTime)
{
	
	uint8_t i;///定义临时变量
	uint32_t year_day;///定义一年的秒数变量
	uint16_t year;
	uint32_t week;
//	DateTimeDef sDateTime;

	//time_unix=1356998400;///初始时间戳:2013-01-01-0:0:0 UTC 北京时间
	week=unix;
	unix=unix-1356998400;///时间戳减初始时间戳；
	year=2013;///定义初始年	
	year_day=31536000;
		////定义初始年（2013）当年秒数31536000 365days
	
	///时间戳年计算，如果时间戳大于等于当年时间戳循环
	while(unix>=year_day)
	{
		unix=unix-year_day;///减掉当年秒数
		year++;////年份加一
		if(((year%4)==0)&&((year%100)!=0))////判断当年是否闰年
		{year_day=31622400;}
		else
		{year_day=31536000;}
	}
	
	////判断当年是否闰年
	if(((year%4)==0)&&((year%100)!=0)){month[1]=2505600;}
	else {month[1]=2419200;}
	
	/////月份计算
	for(i=0;i<12;i++)
	{
		////时间戳大于i月秒数
		if(unix>=month[i])
		{
			unix=unix-month[i];
		}
		else
		{	
			i++;
			break;
		}
	}
	
	//得到年	
	sDateTime->Year=year;
	
	//得到月；
	sDateTime->Month=i;	
	
	//得到周
	week=week/86400+4;///从2013-01-01经过的天数，配平星期数
	sDateTime->WeekDay=week%7;
	
	////得到日	
	sDateTime->Date=unix/86400+1;
	
	///得到当日秒数
	unix=unix%86400;
	
	///得到小时	
	sDateTime->Hours=unix/3600;
	
	///得到当前分钟秒数
	unix=unix%3600;
	
	///得到当前分钟
	sDateTime->Minutes=unix/60;
	
	///得到当前秒数
	sDateTime->Seconds=unix%60;
	
	return;
}

////UTC转UNIX时间戳

uint32_t DateTimeToUnix(DateTimeDef *sDateTime)
{
	uint32_t unix=1356998400;
	uint32_t year_unix;
	uint16_t year;
	uint8_t i;
	uint32_t data;
	year=sDateTime->Year;//+2000;
	
	////判断当年是否闰年
	if(((year%4)==0)&&((year%100)!=0)){month[1]=2505600;}
	else {month[1]=2419200;}
	
	////时间戳年计算，如果时间戳大于等于当年时间戳循环
	while(year>2013)
	{
		////年份减一
		year--;
		
		////判断当年是否闰年
		if(((year%4)==0)&&((year%100)!=0))
		{year_unix=31622400;}
		else
		{year_unix=31536000;}
		
		unix=unix+year_unix;///加一年秒数
	}
	
	/////月份计算
	for(i=(sDateTime->Month-1);i>0;i--)
	{
		////加一月秒数
		unix=unix+month[i-1];
	}
	
	unix=(sDateTime->Date-1)*86400+unix;
	
	data=3600;
	
	unix=sDateTime->Hours*data+unix;		
	unix=sDateTime->Minutes*60+unix;
	unix=unix+sDateTime->Seconds;	
	
	return unix;
}

/* USER CODE END PFP */


/* Private user code ------------------私有用户程序---------------------------------------*/
/* USER CODE BEGIN  */



/* USER CODE END  */





/************************ (C) COPYRIGHT CunJu *****END OF FILE****/
